package common.utils.traingenerateWords;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import common.utils.GetAllFilesOfDir;

/**
 * Se encarga de generar los archivos para entrenar la red y los utilizados para probar la misma
 * en base a los archivos con los coeficientes de mfcc obtenidos.
 * @author Martin
 *
 */
public class GenerarEntradasFiles {

	private String dirWordSeparados = "d:/WAVS_TO_COEF/Prueba9/individualesPalabras/";
	private String dirArchGenerados = "d:/WAVS_TO_COEF/Prueba9/generadosPalabras/";

    private static final String LOG4J = "log4jGenerarEntradas.properties";
	private static final Logger  logger  = Logger.getLogger(GenerarEntradasFiles.class);
     
    static SimpleDateFormat format = new SimpleDateFormat ("dd/MM/yyyy hh:mm:ss");


    /**
     * @param args
     */
    public static void main(String[] args) {
        new GenerarEntradasFiles(); 
    }
    
	
	public GenerarEntradasFiles(){
	    PropertyConfigurator.configure(LOG4J);
	    logger.info("**********************************************************************************************");
	    logger.info("GENERA LOS ARCHIVOS QUE VOY A UTILIZAR EN LA ENTRADA A LA RED, USANDO TODOS LOS ARCHIVOS");

	    Date date=new Date();
	        
	    logger.info("Comienza "+format.format(date));
	        
	    procesar();

	    date=new Date();
	    logger.info("Fin "+format.format(date));

	}
	
	
	/**
	 * Genera los archivos pero sin hacer la segunda normalizacion, 
	 * @param args
	 */
	public void procesar() {
		
		GetAllFilesOfDir g=new GetAllFilesOfDir();
		
		//lista que contendra todos los directorios de los cuales obtuve parametros, y tengo que procesar
		List<File> archivos=new ArrayList<File>();
		
		archivos.addAll( g.getListNameOfFilesInDir( dirWordSeparados	) );
		
		logger.info("Obtenemos datos de los siguientes directorios de coeficientes: ");
		for (int i = 0; i < archivos.size(); i++) {
			logger.info(archivos.get(i).getAbsolutePath());
		}
		
		try {
			logger.info("**************************************************************************************");

			String dirFiles=dirArchGenerados;
				
			logger.info("CREAMOS LOS ARCHIVOS PARA LAS PALABRAS");
				
			File dirArchGen = new File(dirFiles);
			if (!dirArchGen.exists()){
			    dirArchGen.mkdir();
			}
	
			//creo los archivos que usa la red
			File fileParaEntrenar=new File(dirFiles+"/paraentrenar.txt");
			if (!fileParaEntrenar.exists()){ fileParaEntrenar.createNewFile(); }
			File fileParaEntrenarResultados=new File(dirFiles+"/paraentrenarresultados.txt");
			if (!fileParaEntrenarResultados.exists()){ fileParaEntrenarResultados.createNewFile(); } 
			File fileParaProbar=new File(dirFiles+"/paraprobar.txt");
			if (!fileParaProbar.exists()){ fileParaProbar.createNewFile(); } 
			File fileParaProbarResultados=new File(dirFiles+"/paraprobarresultados.txt");
			if (!fileParaProbarResultados.exists()){ fileParaProbarResultados.createNewFile(); } 
			File fileErrores=new File(dirFiles+"/errores.txt");
			if (!fileErrores.exists()){ fileErrores.createNewFile(); } 
			
			FileOutputStream writerParaEntrenar = new FileOutputStream(fileParaEntrenar);
			FileOutputStream writerParaEntrenarResultados = new FileOutputStream(fileParaEntrenarResultados);
			FileOutputStream writerParaProbar = new FileOutputStream(fileParaProbar);
			FileOutputStream writerParaProbarResultados = new FileOutputStream(fileParaProbarResultados);
			
			
			//recorro las palabras que quiero agregar en los archivos
			for (File arch:archivos){
					
			    //obtengo el nombre de la palabra al cual pertenece el directorio
			    String palabra = arch.getName().substring(0,arch.getName().indexOf("-"));
			    String palabraResult = getResult(palabra);
					
			    FileReader fr = new FileReader(arch);
			    BufferedReader bf = new BufferedReader(fr);
					
			    String sCadena=null;
					
			    int numberOfLines = getNumberOfLines(arch.getAbsolutePath());
					
			    logger.info("Proceso el archivo: "+ arch.getAbsolutePath()+" que tiene "+numberOfLines+" lineas.");
					
			    int lineasProcesadas = 0;
			    while ((sCadena = bf.readLine())!=null) {

			        //para entrenar
			        if (lineasProcesadas <= numberOfLines - 5 ){
							
			            writerParaEntrenar.write(sCadena.getBytes());
			            writerParaEntrenar.write("\n".getBytes());
							
			            writerParaEntrenarResultados.write(palabraResult.getBytes());
			            writerParaEntrenarResultados.write("\n".getBytes());
	
			        }
			        //para probar
			        if (lineasProcesadas > numberOfLines - 5){
							
			            writerParaProbar.write(sCadena.getBytes());
			            writerParaProbar.write("\n".getBytes());				
			
			            writerParaProbarResultados.write(palabraResult.getBytes());
			            writerParaProbarResultados.write("\n".getBytes());				
			
			        }
			        lineasProcesadas++;			
						
			    }
			}
				
				
			//cierro los archivos
			writerParaEntrenar.flush();
			writerParaEntrenar.close();
			writerParaEntrenarResultados.flush();
			writerParaEntrenarResultados.close();
			writerParaProbar.flush();
			writerParaProbar.close();
			writerParaProbarResultados.flush();
			writerParaProbarResultados.close();
				
			logger.info("Se creo el archivo: "+ fileParaEntrenar.getAbsolutePath()+" para el coeficiente actual.");
			logger.info("Se creo el archivo: "+ fileParaEntrenarResultados.getAbsolutePath()+" para el coeficiente actual.");
			logger.info("Se creo el archivo: "+ fileParaProbar.getAbsolutePath()+" para el coeficiente actual.");
			logger.info("Se creo el archivo: "+ fileParaProbarResultados.getAbsolutePath()+" para el coeficiente actual.");
			logger.info("Se creo el archivo: "+ fileErrores.getAbsolutePath()+" para el coeficiente actual.");
			logger.info("**************************************************************************************");
			
		
		}catch (Exception e) {
	        // TODO: handle exception
	    }
		
	}

	private int getNumberOfLines(String absolutePath) {
		int lNumeroLineas = 0;
		try{
			FileReader fr = new FileReader(absolutePath);
			BufferedReader bf = new BufferedReader(fr);
			String sCadena;
			while ((sCadena = bf.readLine())!=null) {
			  lNumeroLineas++;
			}
			bf.close();
			fr.close();
		} catch (FileNotFoundException fnfe){
			fnfe.printStackTrace();
		} catch (IOException ioe){
			ioe.printStackTrace();
		}
		
		return lNumeroLineas;
	}


	/**
	 * Le paso el coeficiente y me dice el resultado esperado
	 * @return
	 */
	private String getResult(String palabra){

		if (palabra.startsWith("luces")){
			return "0.0;0.0;1.0";
		}
		if (palabra.startsWith("tele")){
			return "0.0;1.0;1.0";
		}
		if (palabra.startsWith("radio")){
			return "0.0;1.0;0.0";
		}
		if (palabra.startsWith("trabar")){
			return "1.0;0.0;1.0";
		}
		if (palabra.startsWith("persiana")){
			return "1.0;1.0;1.0";
		}
		
		return "0.0;0.0;0.0";
		
		
	}
}
